/**
 * 2019年8月10日 13:42:50
 * @小义 xiaoyi
 * 封装全局 公用方法 组件
 * 
 */

import {scanNameCard} from "@/utils/api/api.js";



/**
 * 方法一
 * 处理10位时间戳 返回格式 2019-08月10日13:55:34
 * 
 */
const timestampToTime = (timestamp) => {
	if(timestamp){
		var date = new Date(timestamp * 1000); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
		var Y = date.getFullYear() + '-';
		var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
		var D = change(date.getDate()) + ' ';
		var h = change(date.getHours()) + ':';
		var m = change(date.getMinutes()) + ':';
		var s = change(date.getSeconds());
		return Y + M + D + h + m + s;
	}else{
		return "";
	}
	//return  M + D + h + m + s;
}

function change(t) { //修改时间
	if (t < 10) {
		return "0" + t;
	} else {
		return t;
	}
}


/**
 * 方法二
 * 获取url上面的指定参数 传入参数名称就可以了
 * 
 *  */
const getUrlParam = (name) => { //name为要获取的参数名
	var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
	var rrr = decodeURIComponent(window.location.search);
	var r = rrr.substr(1).match(reg);
	if (r != null) return unescape(r[2]);
	return null;
}


/**
 * 方法三
 * 获取url上面的所有参数的方法 返回的是一个对象
 * 
 * 
 */

const geeurlcodeObj = () => { //获取url上面的所有参数 返回一个 对象

	try {
		//将url 上的参数全部获取成一个对象
		//var urlcan = '?area_id=2 3&code=021t5Hf8218EdK0hFUe8264Af82t5Hf-&st ate=&a=1 1&b=2 2&c=3 3 3&d=44 4 ';
		var urlcan = decodeURIComponent(window.location.search);;
		urlcan = urlcan.split("?")[1]; //数组
		urlcan = urlcan.replace(/\s/g, "");
		//去空格
		var arr = urlcan.split("&"); //数组
		var obj = {};

		for (var i = 0; i < arr.length; i++) {
			var arritem = arr[i].split("=");
			if (arritem[1]) {
				obj[arritem[0]] = arritem[1];
			} else {
				obj[arritem[0]] = "";
			}
		}

		return obj;
	} catch (e) {
		return {}; //错误后返回空对象
	}
}



/**
 * 方法四
 * 字符串去除所有空格 去除首尾中间的空格
 */
const rmspace = (str) => {
	if (str) {
		return str.replace(/\s/g, "");
	} else {
		return "";
	}
}

/**
 * 方法五
 * 处理富文本
 * 使用场景是 编辑器使用的是 /ssss
 * 富文本没有存入域名 然后要在小程序 或者分布式场景下查看 
 * 那么必须用正则去替换 大概的代码如下
 * 只需要传入 富文本和 对应的资源域名就可以了
 */

const changefwb = (strin, baseStatic) => { //懒加载处理 将src 换成 v-lazy=
	let newStr = strin.replace(new RegExp(/src=\"/g), `mode="widthFix" src="${baseStatic}`); //v-lazy=

	return newStr;
}



/***
 * 方法六
 * JS截取指定长度的的字符串（含中文）,中文自动按2个字符截取，多出部分用...代替
 * 
 * 参数1 字符串
 * 参数2 截取的长度
 * 
 */
const setString = (str, len) => {
	var strlen = 0;
	var s = "";
	for (var i = 0; i < str.length; i++) {
		if (str.charCodeAt(i) > 128) {
			strlen += 2;
		} else {
			strlen++;
		}
		s += str.charAt(i);
		if (strlen >= len) {
			return s + "...";
		}
	}
	return s;
}


/**
 * 方法七
 * 
 * js 对象合并 主要是用的es6的方法
 * 
 */
const codeobj = (obj1, obj2) => {

	let form = obj1;
	let obj = obj2;

	Object.assign(form, obj);

	return form;

}


/***
 * 方法八
 * 
 * js 判断当前浏览器 是不是 微信浏览器 如果是返回 true
 * 
 */


const isWeiXin = () => {
	var ua = window.navigator.userAgent.toLowerCase();
	if (ua.match(/MicroMessenger/i) == 'micromessenger') {
		return true;
	} else {
		return false;
	}
}

/**
 * 方法九
 * js 截取某个字符串前面的内容：
 * 
 * 往左边截取
 * 
 * www.cnblogs.com/shaozhu520/p/10472027.html
 */
const jiequletft = (varstr, gzj) => {
	let tr = varstr.match('/(\S*)' + gzj + '/')[1];
	return tr;
}



/**
 * 方法十
 * 
 * 获取当前时间戳
 */
//从1970年开始的毫秒数然后截取10位变成 从1970年开始的秒数
const newdate = () => {
	var tmp = Date.parse(new Date()).toString();
	tmp = tmp.substr(0, 10);
	return tmp;
}




/**
 * 方法十一
 * 
 * 删除数组中指定元素 传数组和指定的值就可以了
 * @param arr
 * @param val
 */
const removeByValue = (arr, val) => {

	for (var i = 0; i < arr.length; i++) {
		if (arr[i] == val) {
			arr.splice(i, 1)
			break
		}
	}

	return arr;

}



/**
 * 方法十二
 * 
 * 将小数字符串精确到指定位数
 * @param num string 字符串类型的小数
 * @param index int 精确到小数点第几位
 */
const roundFloat = (num, index) => {
	return Number(num).toFixed(index)
}



/**
 * 方法十三
 * 数组去重
 * @param {Array} arr 
 * @returns {Array}
 */

const arrayUnique = (arr) => {
	var newArr = []
	for (var i = 0, len = arr.length; i < len; i++) {
		for (var j = i + 1; j < len; j++) {
			if (arr[i] === arr[j]) {
				//获取没重复的最右一值放入新数组
				++i
			}
		}
		newArr.push(arr[i])
	}
	return newArr
}


/**
 * 方法十四
 * 验证身份证号
 * @param el 号码输入input
 * @returns {boolean}
 */

const checkCardNo = (el) => {
	var txtval = el.value;
	var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
	return reg.test(txtval)
}



const getTimeOut = () => {
}


/**
 * 方法十五
 * 生成随机字符串(可指定长度)
 * @param len
 * @returns {string}
 */
const randomString = (len) => {
	len = len || 8;
	var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
	/****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
	var maxPos = $chars.length;
	var pwd = '';
	for (var i = 0; i < len; i++) {
		pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
	}
	return pwd;
}


/**
 * 方法十六
 * 生成随机颜色
 * 
 */
const getRandomColor = () => {
	const rgb = []
	for (let i = 0; i < 3; ++i) {
		let color = Math.floor(Math.random() * 256).toString(16)
		color = color.length == 1 ? '0' + color : color
		rgb.push(color)
	}
	return '#' + rgb.join('')
}

/**
 * 方法十七
 * 
 * 检测密码强度
 * @param str //检测的密码
 * @returns {Number} 密码强度
 */
const checkPwd = (str) => {
	var nowLv = 0;
	if (str.length < 6) {
		return nowLv
	}

	if (/[0-9]/.test(str)) {
		nowLv++
	}

	if (/[a-z]/.test(str)) {
		nowLv++
	}

	if (/[A-Z]/.test(str)) {
		nowLv++
	}

	if (/[\.|-|_]/.test(str)) {
		nowLv++
	}

	return nowLv;
}



const checkPhone = (phone) => {
	if (!(/^1[23456789]\d{9}$/.test(phone))) {
		//alert("手机号码有误，请重填");  
		return false;
	} else {
		return true;
	}
}


//获取字符串的字节长度
/**
 * 获取字节长度，全角字符两个单位长度，半角字符1个单位长度
 */
const getByteLen = (val)=> {
	var len = 0;
	if (!val) {
		return len;
	}
	for (var i = 0; i < val.length; i++) {
		if (!val[i]) {
			continue;
		}
		// 全角
		if (val[i].match(/[^\x00-\xff]/ig) != null) {
			len += 2;
		} else {
			len += 1;
		}
	}
	return len;
}


//计算字符串字节长度
/* 
 * 截取指定字节长度的字符串 
 * 注：半角长度为1，全角长度为2
 * str:字符串 
 * len:截取长度
 * return: 截取后的字符串及是否截取的标记（扩展用）code=1 字符串截断   code=0  字符串未截断
 */  
const cutStrByte =(str, len) =>{
	//校验参数
	if(!str || !len){
		return {"cutStr":"","code":0};
	}
	var code = "1",// 默认返回code值，已截断
		strLen = str.length,// 原字符串长度
		cutStr;
	//如果字符串长度小于截取长度的一半,则返回全部字符串
	if (strLen <= len/2){  
		cutStr = str;
		code = "0";
	}else{
		//遍历字符串
		var strByteCount = 0;
		for (var i = 0; i < strLen ; i++ ){
			//中文字符字节加2  否则加1
			strByteCount += getByteLen(str.charAt(i));
			//i从0开始 截断时大于len 只截断到第i个
			if(strByteCount > len){
				cutStr = str.substring(0, i);
				cutStr+='...'
				break;
			}else if(strByteCount == len){
				cutStr = str.substring(0, i + 1);
				cutStr+='...'
				break;  
			}
		}
	}
	//cutstr为空，没有截断字符串
	if (!cutStr){
		cutStr = str;
		code = "0";
	}
	return {"cutStr":cutStr, "code":code};
}

const gettimestring = ()=>{
	let now = new Date(),hour = now.getHours();
	let timestr = "";
	if(hour < 6){
		timestr = "凌晨好！";
	}else if (hour < 9){
		timestr = "早上好！";
	} else if (hour < 12){
		timestr = "上午好！";
	} else if (hour < 14){
		timestr = "中午好！";
	} else if (hour < 17){
		timestr = "下午好！";
	} else if (hour < 19){
		timestr = "傍晚好！";
	} else if (hour < 22){
		timestr = "晚上好！";
	} else {
		timestr = "夜里好！";
	}
	return timestr;
}


//时间戳解析多久前
const formatMsgTime = (timespan)=> {
	if(!timespan){
	  return "";
	}
  timespan = timespan*1000;//
  var dateTime = new Date(timespan) // 将传进来的字符串或者毫秒转为标准时间
  var year = dateTime.getFullYear()
  var month = dateTime.getMonth() + 1
  var day = dateTime.getDate()
  var hour = dateTime.getHours()
  var minute = dateTime.getMinutes()
  // var second = dateTime.getSeconds()
  var millisecond = dateTime.getTime() // 将当前编辑的时间转换为毫秒
  var now = new Date() // 获取本机当前的时间
  var nowNew = now.getTime() // 将本机的时间转换为毫秒
  var milliseconds = 0
  var timeSpanStr
  milliseconds = nowNew - millisecond
  if (milliseconds <= 1000 * 60 * 1) { // 小于一分钟展示为刚刚
    timeSpanStr = '刚刚'
  } else if (1000 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60) { // 大于一分钟小于一小时展示为分钟
    timeSpanStr = Math.round((milliseconds / (1000 * 60))) + '分钟前'
  } else if (1000 * 60 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24) { // 大于一小时小于一天展示为小时
    timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60)) + '小时前'
  } else if (1000 * 60 * 60 * 24 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24 * 15) { // 大于一天小于十五天展示位天
    timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60 * 24)) + '天前'
  } else if (milliseconds > 1000 * 60 * 60 * 24 * 15 && year === now.getFullYear()) {
    timeSpanStr = month + '-' + day + ' ' + hour + ':' + minute
  } else {
    timeSpanStr = year + '-' + month + '-' + day + ' ' + hour + ':' + minute
  }
  return timeSpanStr
}




// 对比版本号
//ov 当前系统版本号
// nv 最新的版本号  后台给的
const compareVersion = (ov, nv)=> {
	// console.info(ov, nv,"比对版本号");
	if (!ov || !nv || ov == "" || nv == "") {
		return false;
	}
	let b = false,
		ova = ov.split(".", 4),
		nva = nv.split(".", 4);
	for (let i = 0; i < ova.length && i < nva.length; i++) {
		let so = ova[i],
			no = parseInt(so),
			sn = nva[i],
			nn = parseInt(sn);
		if (nn > no || sn.length > so.length) {
			return true;
		} else if (nn < no) {
			return false;
		}
	}
	if (nva.length > ova.length && 0 == nv.indexOf(ov)) {
		return true;
	} else {
		return false;
	}
}


//判断是否到期 如果到期 返回true 如果没有到期显示false
// 传入时间字符串 比较时间 判断身份是否到期
//返回false 代表没有过期
//返回true 代表已经过期了
const compare_time = (timespan)=>{
	if(!timespan){
		return true;
	}
	let timespan_par = timespan.replace(/\-/g, '/');//序列化
	let tempDate = new Date(`${timespan_par}`);//
	let timenums = Date.parse(tempDate)/1000;//到期的时间戳
	let this_tiem =  Date.parse(new Date())/1000;
	if(this_tiem>timenums){//当前时间 大于到期时间
		//到期了
		return true;
	}else{
		return false;
	}
	// console.info("timenums",timenums);
	// console.info("this_tiem",this_tiem);
}



let getQueryString = function (url, name) {
  var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
  var r = url.substr(1).match(reg)
  if (r != null) {
    return r[2]
  }
  return null;
};

//传扫码后的url
const Handleqrcode = (qrUrl) => {
	
	var shareid = getQueryString(qrUrl, 'shareid');
	var order_id = getQueryString(qrUrl, 'order_id');
	var type = getQueryString(qrUrl, 'type');
	var card_number = getQueryString(qrUrl, 'card_number');
	type = Number(type)
	
	switch(type) {
	    case 1:  //扫码加好友
	        // case 1的代码块
			if(uni.getStorageSync("u_userInfo")){
				//登录了才处理扫码
				//debugger
				var imuser_id = getQueryString(qrUrl, 'imuser_id');
				uni.navigateTo({ //跳转到充值页面
					url: `/pagesim/center/info?id=${imuser_id}`,
				})
				uni.setStorageSync("scancodedata","");
			}else{
				console.info("没登录 不处理扫码");
				uni.showToast({
					title:"请先登录！",
					icon:"none"
				})
			}
	        break;
	    case 2:  //绑定姓名卡
			console.info("222");
			
			scanNameCard({
				card_number:card_number,
			}).then((res)=>{
				console.info("res",res);
				if(res.code==1){
					let namecard = res.data.namecard;
					uni.setStorageSync("sm_namecard",namecard)
					uni.navigateTo({
						url:`/pages/zupu/findpu_info/findpu_info?family_id=${namecard.family_id}&isopen=1`,
					})
				}else{
					uni.showToast({
						title:res.msg,
						icon:"none",
					})
				}
			})
			
	        // case 2的代码块
			// card_number
	        break;
	
	    case 3:
	        // case N的代码块
	        break;
	    default:
	        // default的代码块
	}

	
}
//判断安卓手机权限
const checkPermission = (title,auth)=>{//title：权限未开启提示的消息 auth：需要的权限
	return new Promise((resolve) => {
	    plus.android.requestPermissions(
	        [auth],//这里面放需要的权限
	        function (resultObj) {
	            if (resultObj.granted.length < 1) { //resultObj.granted是授权的权限，是一个数组，你可以直接判断长度也可以拿出来单独判断
	              uni.showToast({
	                    icon: "none",
	                    title,
	                });
	                resolve(false)
					//跳转到应用权限设置页面
	                // let timer1 = setTimeout(() => { //没有开对应的权限，打开app的系统权限管理页
	                //     var Intent = plus.android.importClass("android.content.Intent");
	                //     var Settings = plus.android.importClass("android.provider.Settings");
	                //     var Uri = plus.android.importClass("android.net.Uri");
	                //     var mainActivity = plus.android.runtimeMainActivity();
	                //     var intent = new Intent();
	                //     intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
	                //     var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
	                //     intent.setData(uri);
	                //     mainActivity.startActivity(intent);
	                //     clearTimeout(timer1)
	                //     timer1 = null
	                // }, 1000)
	            } else {
	                resolve(true)
	            }
	        }
	    );
	})
}

export {
	getTimeOut,
	timestampToTime, //10位时间戳 转年月日时分秒
	getUrlParam, //获取url上的指定参数
	geeurlcodeObj, //获取url上面的参数 返回对象
	rmspace, //字符串去除所有空格 去除首尾中间的空格
	changefwb, //处理富文本
	setString, //字符串截取指定长度 然后...
	codeobj, //对象合并
	isWeiXin, //判断当前浏览器是不是微信浏览器 返回布尔值
	jiequletft, //截取字符串 往左边截取
	newdate, //获取当前时间戳
	removeByValue, //删除数组中指定的值 指定的元素
	roundFloat, //将小数精确到指定位数
	arrayUnique, //数组去重
	checkCardNo, //验证身份证方法 返回布尔值
	randomString, //生成随机字符串 可以指定长度
	getRandomColor, //生成随机颜色
	checkPwd, //检测密码强度
	checkPhone,
	getByteLen,//获取字符串字节长度
	cutStrByte,//截取指定的字符串长度
	gettimestring,//通过当前时间获取问候语
	formatMsgTime,
	compareVersion,
	compare_time,
	
	getQueryString,
	Handleqrcode,
	checkPermission
}


/***
 * 
 * 使用方法 {} 按需引入 需要上面哪个方法引入哪个方法
 * 
 * //引入
 * import {timestampToTime,checkPwd} from "@/utils/yicode"
 * 
 * //调用
 * timestampToTime()
 * checkPwd()
 * 
 * 
 */
